

# list 列表

# list1 = [1,2,3,4,]
# list1.insert(1,6)
# print(list1)
# 列表是线性的存储方式，优点通过索引访问比较快、缺点是增删慢


class LinkNode():              # 这里定义了一个链表的节点类
    # 初始化定义了 节点内容和节点指向
    def __init__(self,data,next = None):
        # 节点内容
        self.data = data
        # 节点指向
        self.next = next
    # 完成新节点内容的添加
    def add(self,data):                       # 这里是节点指向的改变
        # 找到最后一个节点的指向
        if self.next is None:
            self.next = LinkNode(data)        # 找到最后一个节点的指向后将添加进来的内容填充进来
        else:
            #如果之前那个节点不是最后一个节点 那么就判断下一个节点是不是最后一个节点（有点类似递归的方法）
            self.next.add(data)

# 这里定义了一个链表的整体类
class LinkList():
    # 初始化定义了链表表头
    def __init__(self):         # 初始化定义一个表头 且初始时表头内容为空 下一个节点地址也为空
        self.head = None
    # 通过调用节点类的添加功能 达到在最后的表头位置添加元素
    def add(self,data):
        # 如果是空链表 则直接添加需要添加的元素
        if self.head is None:
            self.head = LinkNode(data)
        # 如果不是空链表 则需要找到最后一个表头
        else:
            self.head.add(data)
    # 定义打印格式
    def __str__(self):
        # 如果是空链表则直接打印空列表
        if self.head is None:
            return '[]'
        # 如果不是空链表则依次打印各节点内容
        else:

            info = '['
            # 从第一个节点开始打印节点内容
            tmpNode = self.head
            # 用一个while循环实现所有节点的打印 （判断条件是节点是否是为空）
            while tmpNode is not None:         # 打印到空指向为止
                # 打印各节点内容
                info += str(tmpNode.data) + ','
                # 更换到下一个节点
                tmpNode = tmpNode.next
            info += ']'
            # 返回打印输出的格式
            return info


    def insert(self,index,data):
        if self.head is None:
            self.head = LinkNode(data)
        else:
            # 如果是零号位置
            if index == 0:
                self.head = LinkNode(data,self.head)
            else:
                p = self.head
                curIndex = 0
                # 有点像击鼓传花
                while curIndex < index-1:
                    p = p.next                # 这是完成了 目标前一个指向转移到 新添加的内容上的功能
                    curIndex += 1             # 用来计数
                p.next = LinkNode(data,p.next)   # 这是完成新插入的数据内容填充 以及其指向的完成

    def get(self,index):
       if self.head is None:
           print('链表为空链表，无内容')
       else:
        p = self.head
        curIndex = 0
        while curIndex < index-1 :
            p = p.next
            curIndex += 1
        infor = p.data
        return infor


l1 = LinkList()
l1.add('原始天尊')
l1.add('宙斯')
l1.add('深渊之神')
print(l1)
l1.insert(0,'如来佛祖')
print(l1)



# 添加方法
# 1. 插入
#   insert(self,index,data)
# 2. 得到第几个
#   get(self,index)
# 3. 长度
#   size(self)
# 4. 删除(根据内容)
#   delete(self,data)
# 5. 删除(根据位置）
#   deleteByIndex(self,index)
# 6. 将另外一个链表的内容添加到当前链表后面
#   addAll(self,list2)
# 7. 倒置
#   reverse()

